// Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
//
// Licensed under the Mulan PSL v2.
// You can use this file according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of the License at
//
//     http://license.coscl.org.cn/MulanPSL2
//
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
// FOR MORE DETAILS.

#include "DatasetInfo.h"

using namespace SG::DBManager::HDF5;

/**
 * @brief 创建表单。
 *
 * @param m_FileShdPtr 指向 HDF5 文件的共享指针。
 *
 * 使用指定的数据块大小和数据类型在 HDF5 文件中创建一个数据集。数据集的空间为无限制的，且启用了分块。
 */
void DatasetInfo::CreatTable (HighFive::File* m_FileShdPtr)
{
    HighFive::DataSetCreateProps props;
    props.add (HighFive::Chunking ({ DATASET_CHUNK_SIZE / m_dataSize }));                                        ///< 设置数据块大小
    m_FileShdPtr->createDataSet (
        m_path, HighFive::DataSpace ({ 0 }, { HighFive::DataSpace::UNLIMITED }), *m_dataType, props, {}, true);  ///< 创建数据集
    m_isCreate = true;
}

/**
 * @brief 获取要加载的表单的起始位置和长度。
 *
 * @param loadIndex 要加载的索引。
 * @param[out] obegin 起始位置。
 * @param[out] oLength 缓存长度。
 *
 * 根据给定的索引和缓存大小计算起始位置和缓存长度。如果计算出的缓存长度超出表单数据范围，则调整长度以适应表单的实际行数。
 */
void DatasetInfo::CalcIndexBeginAndLength (std::size_t loadIndex,
                                           _OUT std::size_t& obegin,
                                           _OUT std::size_t& oLength,
                                           uint64_t          cachesize) const
{
    // 对于要加载的表单，获取dataspacce的begin与length
    oLength = cachesize / m_dataSize;      ///< 计算缓存长度
    obegin  = 0;                           ///< 默认起始位置为 0
    if (loadIndex > oLength / 2)
    {
        obegin = loadIndex - oLength / 2;  ///< 计算起始位置
    }

    // 如果缓存的数据超出了表单范围，则调整缓存长度
    if ((obegin + oLength) > m_rowCount)
    {
        oLength = m_rowCount - obegin;
    }
}
